exports.Map = new Class(/** @lends CaboCity.Map# */{
	/**
	 * @class Almacena toda la información de un mapa.
	 * @constructs
	 * 
	 * @property {MAPLIST_TODO} pos Mapa en forma de vector.
	 * @property {CaboCity.basic.Size} size Tamaño en tiles del mapa.
	 * @property {CaboCity.Client} owner Cliente propietario del mapa.
	 * 
	 * @param {CaboCity.t.MapOptions} mapOptions
	 * 
	 * */
	initialize: function(mapOptions){
		this.pos = new Array(this.size.x*this.size.y);
	}
	
	/**
	 * Establecer un "algo" TODO en la posicion indicada del mapa.
	 * 
	 * @param {CaboCity.basic.Point} position Posición de mapa.
	 * @param {Integuer} level Nivel donde se añadirá la definición.
	 * @param {CaboCity.def.Build|CaboCity.def.Wt} def Definición a añadir al mapa.
	 * */
	,set: function(position, level, def){
		this.pos[ this.coor2vec(position, level) ] = def;
	}
	
	,exports: function(){
		var mapToExport = new Array(this.size.x*this.size.y);
		this.pos.each(function(item, vpos){
			mapToExport[vpos] = item.exports();
		});
		
		return mapToExport;
	}
	
	/**
	 * Convierte una posición a coordenada de vector.
	 * */
	,coor2vec: function(coor, level){
		if(coor.x >= this.size.w || coor.x < 0) return -1;
		if(coor.y >= this.wize.h || coor.y < 0) return -1;
		var vec = coor.y*this.size.w + coor.x;
		return vec;
	}
});

exports.MapOptions = new Class(/** @lends CaboCity.t.MapOptions# */{
	/**
	 * @class Opciones de configuración del mapa.
	 * @constructs
	 * 
	 * @property {CaboCity.t.Size} size Tamaño del mapa en tiles.
	 * @property {CaboCity.Client} owner Identificador del creador/responsable del mapa.
	 * */
	initialize: function(){}
	
	/**
	 * Tamaño en tiles del mapa.
	 * @public
	 * 
	 * @param {Integer} w Tamaño en ancho en tiles del mapa.
	 * @param {Integer} h Tamaño en alto en tiles del mapa.
	 * 
	 * @return this
	 * */
	,setSize: function(w, h){
		this.size = new api.basic.Size(w, h);
		return this;
	}
	
	/**
	 * Estable el "propietario"/responsable del mapa.
	 * @param {CaboCity.Client} owner Cliente propietario del mapa.
	 * 
	 * @return this
	 * */
	,setOwner: function(owner){
		this.owner = owner;
		
		return this;
	}
	
	/**
	 * Comprueba si el objeto está bien formado.
	 * @return {Boolean}
	 * */
	,valid: function(){
		
	}
});

exports.newMap = function(client, args){
	var api = require('./cabocity.js').api; //Obtenemos API del juego.
	
	var mapOpt = new api.mapOpt.MapOptions();
	mapOpt.setSize(10,10).setOwner(client); //Configuramos el mapa.
	
	var newMap = new api.map.NewMap(mapOpt); //Creamos el mapa.
	client.setMap(newMap);
	
	//Creamos los objetos del mapa.
	for(var x=0; x<newMap.size.w; x++){
		for(var y=0; y<newMap.size.h; h++){
			var wt = new api.def.createWt( api.def.wt['green1'] );
			newmap.set(new api.t.Point(x, y), 0, wt);
		}
	}
	
	//Mapa exportado para tener la forma adecuada para ser enviado mediante json.
	var exportedMap = newMap.exports();
	
	var answer = new api.cmd.Answer();
	answer.setReceiver(client, {map: exportedMap});
	return answer; //Devolvemos el mapa al cliente mediante una respuesta.
}

/*
Auto-generate new Map.
*/
exports.iniExt = function(main){
	main.addExt({
		ini: function(){
			this.addNewCommand({
				r: 'newMap'
				,fun: this.generateNewMapFromClient
			});
		}
		
		//Callback command function.
		,generateNewMapFromClient: function(client, command){
			var answer = this.generateNewMap(client, client.data.mapSize);
			return this.makeAnswer(command, answer);
		}
		,generateNewMap: function(client, size){
			var newMap = new Array();
			for(var x=0; x<size.x; ++x){
				for(var y=0; y<size.y; ++y) {
					newMap[ client.coor2vec({'x':x, 'y':y}) ] = 1;//game.gameInfo.wt.gen("green1");
				}
			}
	
			return {wt: newMap};
		}
	});
}
